#ifndef SATELLITEHANDLER_H
#define SATELLITEHANDLER_H

#include <QTableWidget>
#include <QString>
#include <random>
#include <QDateTime>
#include <QtWidgets/QMainWindow>
#include <QRegExp>
#include <type_traits>
#include <bitset>

// 定义一个结构体，用于存储卫星参数
struct SatelliteData {
    QString satelliteType; // 卫星类型
    int satelliteID; // 卫星号
    QString params[42]; // 存储42个参数
};

struct DecoderBD2RAWEPHEMmeo_data{
    char time[80];
    uint32_t prn; //卫星号
    uint32_t refWeek; //星历周计数
    uint32_t refSecs; //历书参考时间
    uint16_t Pre;// 前导码 11 bits 帧同步码
    uint8_t Rev;// 版本号 4 bits 保留位
    uint8_t FraID;// 帧 ID 3 bits 子帧计数
    uint32_t SOW;//SOW 20 bits 周内秒计数
    uint8_t checksum1 ; // 校验码 4 bits 校验码
    uint8_t SatH1;//卫星健康标志 1 bit 卫星健康标志
    uint8_t AODC;// 年龄值 5 bits 时钟数据龄期
    double URA;// URAI 4 bits 用户距离精度指数
    uint16_t WN;// WN 13 bits 整周计数
    double toc;// TOW 17 bits 钟差参数toc
    uint16_t TGD1;// TGD1 10 bits 星上设备时延差TGD1
    uint16_t TGD2;// TGD2 10 bits 星上设备时延差TGD2
    double alpha0;//α0 8 bits 电离层延迟改正模型参数α0
    double alpha1;//α1 8 bits 电离层延迟改正模型参数α1
    double alpha2;//α2 8 bits 电离层延迟改正模型参数α2
    double alpha3;//α3 8 bits 电离层延迟改正模型参数α3
    double beta0;// β0 8 bits 电离层延迟改正模型参数β0
    double beta1;// β1 8 bits 电离层延迟改正模型参数β1
    double beta2;// β2 8 bits数据太大，用double类型 电离层延迟改正模型参数β2
    double beta3;// β3 8 bits 电离层延迟改正模型参数β3
    double a2;// a2 11 bits 钟差参数a2
    double a0;// a0 24 bits 钟差参数a0
    double a1;// a1 22 bits 钟差参数a1
    uint8_t AODE;// AODE 8 bits 星历数据龄期
    double deltaN;//Δn 16位 卫星平均运动速率与计算值之差
    double Cuc;// Cuc 18 bits 纬度幅角的余弦调和改正项的振幅
    double M0;// M0 32 bits 参考时间的平近点角
    double e;// e 32 bits 偏心率
    double Cus;// Cus 18 bits 纬度幅角的正弦调和改正项的振幅
    double Crc;// Crc 18 bits 轨道半径的余弦调和改正项的振幅
    double Crs;// Crs 18 bits 轨道半径的正弦调和改正项的振幅
    double A;// 根号A 32 bits 长半轴的平方根
    uint32_t toe;// toe 32 bits 星历参考时间
    double i0;// i0 32 bits 参考时间的轨道倾角
    double Cic;// Cic 18 bits 轨道倾角的余弦调和改正项的振幅
    double Omega;// Ω 24 bits 升交点赤经变化率
    double Cis;// cis 18 bits 轨道倾角的正弦调和改正项的振幅
    double IDOT;// IDOT 14 bits 轨道倾角变化率
    double Omega0;//Ω0 32 bits 按参考时间计算的升交点经度
    double w;// ω 32 bits 近地点幅角
};

struct DecoderBD2RAWEPHEMgeo_data{
    char time[80];
    uint32_t prn;
    uint32_t refWeek;
    uint32_t refSecs;
    uint16_t Pre ; // 前导码 11 bits
    uint8_t Rev ;  // 版本号 4 bits
    uint8_t FraID ; // 帧 ID 3 bits
    uint8_t checksum1; // 校验码 8 bits
    uint32_t SOW ; // SOW 20 bits
    uint8_t Pnum1[10]={0};//Pnum1 页面不进入数据库 页面编号
    uint8_t SatH1;//SatH1 1bits
    uint8_t AODC;//AODC 5bits
    double URA;//URA
    uint16_t WN;//WN 13bits
    double toc;//toc 17bits
    uint16_t TGD1;//TGD1 10bits
    uint16_t TGD2;//TGD2 10bits
    double alpha0;//alpha 8bits
    double alpha1;//alpha 8bits
    double alpha2;//alpha 8bits
    double alpha3;//alpha 8bits
    double beta0;//beta0 8bits
    double beta1;//beta1 8bits
    double beta2;//beta2 8bits
    double beta3;//beta3 8bits
    double a0;//a0 24bits
    double a1;//a1 4bits
    double a2;//a2 11bits
    uint8_t AODE;//AODE 5bits
    uint16_t deltaN;//Δn 16bits
    double Cuc;//Cuc 18bits
    double M0;//M0 32bits
    double Cus;//Cus 18bits
    double e;//e 32bits
    double A;//根号A 32bits
    double Cic;//Cic 18bits
    double Cis;//Cis 18bits
    uint32_t toe;//toe 17bits
    double i0;//i0 27bits
    double Crc;//Crc 18bits
    double Crs;//Crs 18bits
    double Omega;//Ω 24bits
    double Omega0;//Ω 32bits
    double w;//w 32bits
    double IDOT;//IDOT 14bits
};

struct DecoderGPSRAWEPHEM_data {
    char time[80];
    uint32_t prn;          // 卫星号
    uint32_t refWeek;      // 星历参考周计数
    uint32_t refSecs;      // 星历参考时间（秒）
    std::bitset<8> Pre;           //固定同步码
    std::bitset<14> TLW;            //特许授权用户的遥测码
    double Rev;//保留位
    double SOW;//截短的周内计数值
    double warn;//警告位
    double Anti;//Anti-Spoof标志
    double Z;//子帧识别标志
    double WN;//WN（星期数）
    double PCA;//L2频段测距码有效性
    double URA;//用户测距精度（URA）
    double SatH1;//卫星健康状况
    uint16_t IODC;//IODC时钟数据期号
    double P;//P码数据位
    double TGD;//群延迟差估计
    double toc;//卫星时钟校正参数
    double af2;//卫星时钟校正模型参数之一
    double af1;//卫星时钟校正模型参数之一
    double af0;//卫星时钟校正模型参数之一
    double IODE;//IODE（数据期号）
    double Crs;//轨道半径的正弦调和项改正的振幅
    double deltaN;//平均运动角速度校正值
    double M0;//平近点角
    double Cuc;//升交点角距余弦调和校正振幅
    double e;//轨道偏心率
    double Cus;//升交点角距正弦调和校正振幅
    double A; //卫星轨道长半轴的平方根
    double toe;//星历参考时间
    double FIT;//拟合间隔标志
    double AODO;//AODO
    double Cic;//轨道倾角余弦调和校正振幅
    double Omega0;//周内时等于0时的轨道升交点赤经
    double Cis;//轨道倾角正弦调和校正振幅
    double i0;//i0,toe时的轨道倾角
    double Crc;//轨道半径余弦调和校正振幅
    double w;//轨道近地角距
    double Omega;//轨道升交点赤经对时间的变化率
    double IDOE;//IDOE
    double IDOT;//IDOT
};

struct GALephemeris_data{
    char time[80];            // 时间
    double satId;            // 卫星号（1-36）
    double FNAVReceived;     // F/NAV星历接收标识
    double INAVReceived;     // I/NAV星历接收标识
    double E1BHealth;         // E1B信号健康标识
    double E5aHealth;         // E5a信号健康标识
    double E5bHealth;         // E5b信号健康标识
    double E1BDVS;            // E1B数据有效性
    double E5aDVS;            // E5a数据有效性
    double E5bDVS;            // E5b数据有效性
    double SISA;              // 空间信号精度
    double Reserved;          // 预留
    double IODNav;           // 星历数据龄期
    double T0e;              // 星历参考时刻 (s)
    double RootA;              // 长半轴的平方根
    double DeltaN;             // 卫星平均运动速率与计算值之差
    double M0;                 // 参考时间的平近点角 (radians)
    double Ecc;                // 偏心率
    double Omega;              // 近地点幅角(radians)
    double Cuc;                // 纬度幅角的余弦调和改正项的振幅
    double Cus;                // 纬度幅角的正弦调和改正项的振幅
    double Crc;                // 轨道半径的余弦调和改正项的振幅
    double Crs;                // 轨道半径的正弦调和改正项的振幅
    double Cic;                // 轨道倾角的余弦调和改正项的振幅
    double Cis;                // 轨道倾角的正弦调和改正项的振幅
    double I0;                 // 参考时间的轨道倾角 (radians)
    double IDot;               // 轨道倾角变化率(radians/s)
    double Omega0;             // 升交点赤径 (radians)
    double OmegaDot;           // 升交点赤径变化率(radians/s)
    double FNAVT0c;          // F/NAV钟差参数参考时刻
    double FNAVAf0;            // F/NAV卫星钟偏差系数
    double FNAVAf1;            // F/NAV卫星钟漂移系数
    double FNAVAf2;            // F/NAV卫星钟漂移率系数
    double INAVT0c;          // I/NAV钟差参数参考时刻
    double INAVAf0;            // I/NAV卫星钟偏差系数
    double INAVAf1;            // I/NAV卫星钟漂移系数
    double INAVAf2;            // I/NAV卫星钟漂移率系数
    double E1E5aBGD;           // E1, E5a广播群延迟
    double E1E5bBGD;           // E1, E5a广播群延迟

};

class SatelliteHandler: public QObject {
    Q_OBJECT
public:
    SatelliteHandler(QTableWidget *tableWidget); // 构造函数，传入表格指针
    void displaySatelliteData(const DecoderBD2RAWEPHEMmeo_data &data);
    void displaySatelliteDataBDmeo(const DecoderBD2RAWEPHEMmeo_data &data);//BDmeo卫星
    void displaySatelliteDataBDgeo(const DecoderBD2RAWEPHEMgeo_data &data);//BDgeo卫星
    void displaySatelliteDataGPS(const DecoderGPSRAWEPHEM_data &data);//GPS卫星
    void displaySatelliteDataGAL(const GALephemeris_data &data); // 显示GAL卫星数据

    void displaySatelliteData(const QString &source); // 从客户端读取卫星数据并显示

    //void displaySatelliteData();
    DecoderBD2RAWEPHEMmeo_data readClientData(const QString &source); // 从客户端读取卫星数据
void handleNewConnection();
    void linkserver();
private:
    QTableWidget *tableWidget; // 指向表格的指针
    std::default_random_engine rng; // 随机数生成器
    std::uniform_int_distribution<int> dist; // 随机数分布

};

#endif // SATELLITEHANDLER_H
